#include <QDebug>
#include <QGraphicsSimpleTextItem>
#include <QResizeEvent>
#include "dailyview.h"

DailyView::DailyView(QWidget *parent)
    : QGraphicsView(parent)
    , startDate(QDate::currentDate())
    , endDate(QDate::currentDate())
    , fontSize(18)
    , timeMergine(5)
{
    endDate = startDate.addDays(3);

    setScene( new QGraphicsScene() );
}

void DailyView::resizeEvent(QResizeEvent* event)
{
    scene()->clear();
    scene()->setSceneRect(0, 0, event->size().width(), fontSize*49);

    QFont font;
    font.setPixelSize(fontSize);

    // 時刻欄を作成
    QList<QGraphicsItem*> timeItemList;
    int y = 0;
    for (int i=0; i<=24; ++i) {
        QGraphicsSimpleTextItem* textItem = scene()->addSimpleText(QString("%1:00").arg(i, 2, 10, QLatin1Char('0')), font);
        timeItemList.push_back(textItem);
        textItem->setPos(timeMergine, y);
        y += fontSize * 2;
    }

    // 作成した時刻をグループ化
    QGraphicsItemGroup* timeGroup = scene()->createItemGroup(timeItemList);
    timeGroup->setZValue(1);
    int timeRight = timeGroup->sceneBoundingRect().right() + timeMergine;

    // 日付欄を作成
    QList<QGraphicsItem*> dateItemList;
    int days = startDate.daysTo(endDate);
    int x = timeRight;
    int w = event->size().width() - x - 1;
    int dayWidth = w / days;
    for (int i=0; i<days; ++i) {
        QDate d = startDate.addDays(i);
        QGraphicsSimpleTextItem* textItem = scene()->addSimpleText(d.toString(Qt::SystemLocaleShortDate), font);
        dateItemList.push_back(textItem);
        int x2 = timeRight + dayWidth * i + ((dayWidth - textItem->boundingRect().width()) / 2);
        textItem->setPos(x2, 0);
    }

    // 作成した日付をグループ化
    QGraphicsItemGroup* dateGroup = scene()->createItemGroup(dateItemList);
    dateGroup->setZValue(3);

    // 日付はのバックグランドは塗りつぶす
    QGraphicsRectItem* dateBg = scene()->addRect(timeRight, 0, w, dateGroup->boundingRect().height(), QPen(), QBrush(Qt::yellow));
    dateBg->setZValue(2);

    // 時刻を日付より下へ移動。
    timeGroup->setPos(0, dateGroup->sceneBoundingRect().bottom() + 2);

    // 1時間ごとに横線表示
    for (int i=0; i<timeItemList.size(); ++i) {
        qreal x1 = 0;
        qreal y1 = timeItemList[i]->sceneBoundingRect().top() - 2;
        qreal x2 = event->size().width();
        qreal y2 = timeItemList[i]->sceneBoundingRect().top() - 2;
        scene()->addLine(x1, y1, x2, y2);
    }

    // 日付ごとに縦線を表示
    for (int i=0; i<dateItemList.size(); ++i) {
        qreal x1 = timeGroup->sceneBoundingRect().right() + timeMergine + dayWidth * i;
        qreal y1 = 0;
        qreal x2 = x1;
        qreal y2 = sceneRect().bottom();
        scene()->addLine(x1, y1, x2, y2);
    }
}
